// 商品的 pinia 状态管理文件

import { defineStore } from 'pinia' // 导入 pinia
import { buyProducts, IProduct } from "../api/shop" // 导入 IProduct 类型
import useProductStore from './product' // 导入商品的状态管理

// 新创建一个新的类型：
// 1、给这个类型添加上购物车中的商品数量 shopCartNum；
// 2、与 IProduct 类型进行合并；
// 3、但是购物车中并不需要商品的库存，所以将 inventory 去掉
type shopCart = {
  shopCartNum: number
} & Omit<IProduct, 'inventory'>

// 初始化 pinia 实例对象
const useCartStore = defineStore('cart', {
  state: () => {
    return {
      cartList: [] as shopCart[], // 购物车列表
      checkoutStatus: '' // 购物车结算后的状态
    }
  },

  getters: {
    // 计算商品总价
    shopTotalPrice(state) {
      return state.cartList.reduce((total, item) => {
        return total += item.price * item.shopCartNum
      }, 0)
    }
  },

  actions: {
    // 1、添加商品到购物车的方法
    addCart(product: IProduct) {
      // 判断商品的库存，如果库存已经没了，直接返回
      if(product.inventory < 1) {
        return
      }

      // 将当前商品添加给购物车，判断当前购物车是否有该商品
      const cartItem = this.cartList.find(item => product.id === item.id);

      if(cartItem) {
        // 如果当前购物车已经存在该商品，只需要让当前商品数量 +1
        cartItem.shopCartNum++
      } else {
        // 如果购物车没有当前商品，将该商品添加进购物车中
        this.cartList.push({
          id: product.id,
          title: product.title,
          price: product.price,
          shopCartNum: 1
        })
      }

      // 初始化商品的容器
      const productStore = useProductStore()
      // 调用去库存的方法
      productStore.decrementProduct(product)
    },
    // 2、结算购物车的方法
    async checkOut() {
      // 发送购买请求
      const res = await buyProducts()

      // 更改当前购买状态
      this.checkoutStatus = res ? '成功' : '失败'

      // 成功后，清空购物车
      res ? (this.cartList = []) : ''
    }
  }
})

export default useCartStore // 导出